# Module 'listwin'
# Pour construire des fenêtres contenant des listes; ce sont des sous-classes
# de gwin

import gwin
import stdwin

def maxlinewidth(a): # Trouve la longueur maximum d'une ligne parmi une
                     # séquence de lignes
	max = 0
	for line in a:
		width = stdwin.textwidth(line)
		if width > max: max = width
	return max

def action(w, string, i, detail): # La méthode sélection de l'élément par
                                  # défaut
	pass

def mup(w, detail): # La méthode souris vers le haut
	(h, v), clicks, button, mask = detail
	i = divmod(v, w.lineheight)[0]
	if 0 <= i < len(w.data):
		w.action(w, w.data[i], i, detail)

def draw(w, ((left, top), (right, bottom))): # La méthode dessin du texte de la
                                             # fenêtre
	data = w.data
	d = w.begindrawing()
	lh = w.lineheight
	itop = top/lh
	ibot = (bottom-1)/lh + 1
	if itop < 0: itop = 0
	if ibot > len(data): ibot = len(data)
	for i in range(itop, ibot): d.text((0, i*lh), data[i])

def open(title, data): # Affiche une liste de lignes dans une fenêtre
	lineheight = stdwin.lineheight()
	h, v = maxlinewidth(data), len(data)*lineheight
	h0, v0 = h + stdwin.textwidth(' '), v + lineheight
	if h0 > stdwin.textwidth(' ')*80: h0 = 0
	if v0 > stdwin.lineheight()*24: v0 = 0
	stdwin.setdefwinsize(h0, v0)
	w = gwin.open(title)
	w.setdocsize(h, v)
	w.lineheight = lineheight
	w.data = data
	w.draw = draw
	w.action = action
	w.mup = mup
	return w
